package main;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Wiki implements Serializable{
    public static List<WikiPage> pages;
    public static Map<String, WikiPage> synonymsMap;

    public Wiki() {
        pages = new ArrayList<WikiPage>();
        synonymsMap = new HashMap<String, WikiPage>();
    }

    public void addWikiPage(WikiPage wikiPage) {
        pages.add(wikiPage);
        synonymsMap.put(wikiPage.getName(), wikiPage);
        List<String> synonyms = wikiPage.getSynonyms();
        for(int i = 0; i < synonyms.size(); i++) {
            synonymsMap.put(synonyms.get(i).toLowerCase(), wikiPage);
        }
    }


    //другой класс???

    /**
     *
     * @param word проверяемое слово из другого класса (не wikiPage)
     * @param wikiPage является ли синонимом для класса wikiPage
     * @return true если синоним, иначе false
     */
    public Boolean isSynonym(String word, WikiPage wikiPage) {
        Boolean isSynonym = false;
        String temp = word;
        if(Character.isUpperCase(word.charAt(0))) {
            temp = Character.toLowerCase(word.charAt(0)) + word.substring(1);
        }
        if(synonymsMap.containsKey(temp)) {
            WikiPage tmp = synonymsMap.get(temp);
            if(tmp.equals(wikiPage)) {
                isSynonym = true;
            }
        }
        return isSynonym;
    }

    public String createLink(String word, WikiPage wikiPage) {
        return "<a href=\"" + wikiPage.getName() + ".html\">" + word + "</a>";
    }

    public void linkageWikiPages(WikiPage w1, WikiPage w2) {
        // в w2 проставляются ссылки на w1
        List<List<String>> allWords = w2.getWords();//список списков строк слов
        List<List<String>> newWords = new ArrayList<List<String>>();//список списков строк слов, в котором синонимы заменены на ссылки
        for(int i = 0; i < allWords.size(); i++) {
            List<String> temp = new ArrayList<String>(allWords.get(i));//список слов в i-той строке исходного списка списков строк слов
            List<String> tmp = new ArrayList<String>();//списоок слов, в котором синонимы в i-той строки исходного списка списков строк слов, будут заменены на ссылки
            for(int j = 0; j < temp.size(); j++) {
                if(isSynonym(temp.get(j), w1)) {
                    temp.set(j, createLink(temp.get(j), w1));
                }
                tmp.add(temp.get(j));
            }
            newWords.add(tmp);
        }
        w2.update(newWords);
    }

    public void linkageAllWikiPages() {
        for(int i = 0; i < pages.size() - 1; i++) {
            for(int j = 1; j < pages.size(); j++) {
                if(i != j) {
                    linkageWikiPages(pages.get(i), pages.get(j));
                    linkageWikiPages(pages.get(j), pages.get(i));
                }
            }
        }
    }

    public void linkagePagesWithNewWikiPage(WikiPage newWikiPage) {
        for(int i = 0; i < pages.size(); i++) {
            linkageWikiPages(pages.get(i), newWikiPage);
            linkageWikiPages(newWikiPage, pages.get(i));
        }
    }

    public void createHtmlPages() throws IOException{
        for(WikiPage page: pages) {
            page.createHtmlFile();
        }
    }
}
